/******************************************************
Cours:   LOG121
Session: A2013
Groupe:  
Projet: Laboratoire #3
etudiant(e)s: Simon Castro
			  Fredy Alexander 
			  Renaud Vincent
              
              
Professeur : Francis Cardinal
Nom du fichier: TestJeu.java
Date c: 2013-11-12
Date dern. modifie. 2013-11-12
*******************************************************
Historique des modifications
*******************************************************
2013-11-11 Version 1.0
*******************************************************/

package testsUnitaires;
import static org.junit.Assert.*;

import java.util.ArrayList;

import org.junit.Before;
import org.junit.Test;

import bunco.CalculScoreBunco;
import bunco.ResultatValide;

import cadricielJeuDe.CollectionDes;
import cadricielJeuDe.CollectionJoueurs;
import cadricielJeuDe.Fabrique;
import cadricielJeuDe.Jeu;
import cadricielJeuDe.Partie;

/**
 * Classe de tests unitaire testant les differents membre de la classe Jeu.
 * @author Fredy
 * @author Simon
 *
 */
public class TestJeu {

	Jeu j;
	Partie p;
	Fabrique f = new Fabrique();
	CollectionDes cd = new CollectionDes();
	CollectionJoueurs cj = new CollectionJoueurs();
	CollectionJoueurs cjTriee = new CollectionJoueurs();
	CalculScoreBunco csb;
	ResultatValide rv;
	
	int nbrDes=3;
	int nbrJoueur;
	int tour1;
	int tour2;
	int tourX;

	//Creation d'une liste de 6 element pour les 6 valeurs d'un de
	ArrayList<Integer> listeValeurs = new ArrayList<Integer>(6);
	
	ArrayList<Integer> valeursEgale = new ArrayList<Integer>(3);
	ArrayList<Integer> valeursNonEgale = new ArrayList<Integer>(3);
	
	@Before
	public void aFaire(){
		
		//Remplissage de la liste, des valeur 1,2,3,4,5,6 tel un de a 6 faces.
		for(int i=1; i<7; i++){
			listeValeurs.add(i);
		}
		
		for(int i=0; i<3; i++){
			
			valeursEgale.add(2); // trois des de valeurs egale 2,2 et 2;
			valeursNonEgale.add(i); // trois des de valeurs 1,2 et 3
		}
		
		//trois tours pre-etablies pour les tests, un nombre de points et un 
		tour1=1;
		tour2=2;
		tourX=5;
		nbrJoueur=3;
		
		//Creation des des selon le nombre requis, et on les ajouter a la
				//collection.
		for(int i=0; i<nbrDes; i++){
			cd.ajouterDe(f.creationDe(6, listeValeurs));
		}
		
		//Creation de de 3 joueurs
		cj.ajouterJoueur(f.creationJoueur("Fredy"));
		cj.ajouterJoueur(f.creationJoueur("Simon"));
		cj.ajouterJoueur(f.creationJoueur("Renaud"));
		
		csb = new CalculScoreBunco();
		p = new Partie(nbrJoueur, tour1,cj,cd);
		j = new Jeu(p,csb);
		rv = new ResultatValide();
		
	}
	
	/**
	 * Test lorsqu'on obtient un score egale a bunco et si on passe la main au
	 * prochain joueur
	 */
	@Test
	public void testBunco(){
		rv = (ResultatValide)j.calculerScoreTour(tour2, valeursEgale);
		assertTrue(rv.getPoints() == 21 && rv.isPasserMain());
	}
	
	/**
	 * Test lorsqu'on obtient 3 des egaux mais pas egale au tour actuelle et
	 * ne passe pas la main au prochain joueur.
	 */
	@Test
	public void testDifferentTour(){
		rv = (ResultatValide)j.calculerScoreTour(tourX, valeursEgale);
		assertTrue(rv.getPoints() == 5 && !rv.isPasserMain());
	}
	
	/**
	 * Test lorsqu'on obtient un de d'une valeur egale au tour actuelle et ne
	 * passe pas la main au prochain joueur.
	 */
	@Test
	public void testUneValeur(){
		rv = (ResultatValide)j.calculerScoreTour(tour1, valeursNonEgale);
		assertTrue(rv.getPoints() == 1 && !rv.isPasserMain());
	}
	
	/**
	 * Test lorsqu'on obtient des des qui sont tous different du tour actuel et 
	 * passe la main au prochain joueur.
	 */
	@Test
	public void testAucunPoint(){
		rv = (ResultatValide)j.calculerScoreTour(tourX, valeursNonEgale);
		assertTrue(rv.getPoints() == 0 && rv.isPasserMain());
	}
	
	/**
	 * Test du triage des joueurs en ordre de celui qui a le plus grand nombre
	 * de points au plus petit. 
	 */
	@Test
	public void testClassementFinal(){
		p.getCJoueur().getJoueurAt(0).setScore(21);
		p.getCJoueur().getJoueurAt(1).setScore(12);
		p.getCJoueur().getJoueurAt(2).setScore(30);
		cjTriee = j.calculerLeVainqueur(p.getCJoueur());
		
		assertTrue(cjTriee.getJoueurAt(0).getScore() == 30 && cjTriee.getJoueurAt(1).getScore() == 21
				&& cjTriee.getJoueurAt(2).getScore() == 12);
		
	}
	
}
